package com.test.liuhb.test.Adapter;

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.test.liuhb.test.entity.Users;

import java.io.IOException;

/**
 * Created by liu.hb on 2018/2/23.
 * TypeAdapter 是Gson自2.0（源码注释上说的是2.1）开始版本提供的一个抽象类，
 * 用于接管某种类型的序列化和反序列化过程，包含两个注要方法 write(JsonWriter,T) 和 read(JsonReader)
 * 其它的方法都是final方法并最终调用这两个抽象方法。
 */

public class UserTypeAdapter extends TypeAdapter<Users> {
    //序列化toJson()
    @Override
    public void write(JsonWriter out, Users value) throws IOException {
        out.beginObject();
        //赋值
        out.name("name").value(value.name);
        out.name("age").value(value.age);
        out.name("email").value(value.email);
        out.endObject();
    }
    //反序列化fromJson()
    @Override
    public Users read(JsonReader in) throws IOException {
        Users user = new Users();
        in.beginObject();
        while (in.hasNext()) {
            switch (in.nextName()) {
                //读值
                case "name":
                    user.name = in.nextString();
                    break;
                case "age":
                    user.age = in.nextInt();
                    break;
                case "email":
                //当我们为User.class 注册了 TypeAdapter之后，
                // 只要是操作User.class 那些之前介绍的@SerializedName 、
                // FieldNamingStrategy、Since、Until、Expos通通都黯然失色，
                // 失去了效果，只会调用我们实现的UserTypeAdapter.write(JsonWriter, User) 方法，
               // 我想怎么写就怎么写。
                case "email_address":
                case "emailAddress":
                    user.email = in.nextString();
                    break;
            }
        }
        in.endObject();
        return user;
    }

}
